home *** CD-ROM | disk | FTP | other *** search
/ Network CD 1 / Network CD.iso / fredfish / 901-910 / ff907 / cyberpager / source / source.lha / library / services.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-06-18  |  4.2 KB  |  168 lines

  1.  /*
  2.   * read the services file looking for a particular service.  returns a
  3.   * struct describing that service if found or NULL if not found (or an error
  4.   * occurs).  format of lines in the service file are:
  5.   * 
  6.   * ; indicates start of a comment
  7.   * 
  8.   * <service name> <phone number> <baud rate> <mage page length> <multiblock>
  9.   */
  10.  
  11. #include "memory.h"
  12.  
  13. #define TEMPLATE "NAME/A,PHONE/A,BAUD/N/A,MAXPAGELEN/N/A,MULTIBLOCK/A"
  14. enum templateArgs {
  15.     ARG_NAME,
  16.     ARG_PHONE,
  17.     ARG_BAUD,
  18.     ARG_LEN,
  19.     ARG_MBLK,
  20.     ARG_sizeof
  21. };
  22.  
  23. #define INPUT_BUFFER_SIZE (1024)
  24.  
  25. PagerService_t *__saveds __asm FindPagerService(register __a0 PagerHandle_t * ph, register __a1 STRPTR serviceName)
  26. {
  27.     PrivatePagerService_t *psvc;
  28.     PagerService_t *svc;
  29.     ULONG line = 0;
  30.     STRPTR inputBuffer, ptr;
  31.     struct RDArgs *ArgsPtr, *MyArgs;
  32.     char *ArgArray[ARG_sizeof];
  33.     BOOL leave;
  34.     BPTR fh;
  35.  
  36.     ObtainSemaphore(&ph->ph_Sema);
  37.  
  38.     /* first look to see if we have already read this service in */
  39.  
  40.     for (psvc = (PrivatePagerService_t *) ph->ph_ServiceList.mlh_Head;
  41.          psvc->psvc_Node.mln_Succ;
  42.          psvc = (PrivatePagerService_t *) psvc->psvc_Node.mln_Succ)
  43.         if (stricmp(serviceName, psvc->psvc_Service.svc_Name) == 0) {
  44.             psvc->psvc_UseCount++;
  45.             ReleaseSemaphore(&ph->ph_Sema);
  46.             return &psvc->psvc_Service;
  47.         }
  48.  
  49.     /*
  50.      * oh, well.  need to read the services file to find information on
  51.      * this service
  52.      */
  53.  
  54.     svc = NULL;
  55.  
  56.     if (inputBuffer = MyAllocVec(INPUT_BUFFER_SIZE)) {
  57.         /* try and open the services file */
  58.  
  59.         if (fh = Open("pager:services", MODE_OLDFILE)) {
  60.             /* loop reading lines looking for the service desired */
  61.  
  62.             leave = FALSE;
  63.  
  64.             while (leave == FALSE && FGets(fh, inputBuffer, INPUT_BUFFER_SIZE - 1)) {
  65.                 line++;
  66.  
  67.                 /*
  68.                  * check to make sure the line isn't all
  69.                  * blank
  70.                  */
  71.  
  72.                 ptr = inputBuffer;
  73.                 while (isspace(*ptr))
  74.                     ptr++;
  75.  
  76.                 if (!*ptr)
  77.                     continue;
  78.  
  79.                 /*
  80.                  * check for comment character at beginning
  81.                  * of line
  82.                  */
  83.  
  84.                 if (*ptr == ';')
  85.                     continue;
  86.  
  87.                 /* setup to call ReadArgs() to parse the line */
  88.  
  89.                 if (MyArgs = (struct RDArgs *)AllocDosObject(DOS_RDARGS, TAG_DONE)) {
  90.                     MyArgs->RDA_Flags |= RDAF_NOPROMPT;
  91.                     MyArgs->RDA_Source.CS_Buffer = inputBuffer;
  92.                     MyArgs->RDA_Source.CS_Length = strlen(inputBuffer);
  93.                     MyArgs->RDA_Source.CS_CurChr = 0L;
  94.  
  95.                     memset((char *)ArgArray, 0, sizeof(ArgArray));
  96.                     if (ArgsPtr = ReadArgs(TEMPLATE, (LONG *) & ArgArray, MyArgs)) {
  97.                         if (stricmp(serviceName, ArgArray[ARG_NAME]) == 0) {
  98.  
  99.                             /*
  100.                              * we've found the
  101.                              * service so
  102.                              * allocate and fill
  103.                              * in a service
  104.                              * structure
  105.                              */
  106.                             leave = TRUE;
  107.  
  108.                             if (psvc = (PrivatePagerService_t *) MyAllocVec(sizeof(PrivatePagerService_t) + strlen(ArgArray[ARG_NAME]) + strlen(ArgArray[ARG_PHONE]) + 2)) {
  109.                                 psvc->psvc_Handle = ph;
  110.                                 psvc->psvc_UseCount = 1;
  111.                                 AddTail((struct List *)&ph->ph_ServiceList, (struct Node *)&psvc->psvc_Node);
  112.  
  113.                                 svc = &psvc->psvc_Service;
  114.  
  115.                                 svc->svc_Name = (STRPTR) & svc[1];
  116.                                 svc->svc_Phone = svc->svc_Name + strlen(ArgArray[ARG_NAME]) + 1;
  117.  
  118.                                 strcpy(svc->svc_Name, ArgArray[ARG_NAME]);
  119.                                 strcpy(svc->svc_Phone, ArgArray[ARG_PHONE]);
  120.                                 svc->svc_BaudRate = *((LONG *) ArgArray[ARG_BAUD]);
  121.                                 svc->svc_MaxPageLen = *((LONG *) ArgArray[ARG_LEN]);
  122.                                 svc->svc_MultiBlock = PagerConfigYesNo(ArgArray[ARG_MBLK]);
  123.                             }
  124.                         }
  125.  
  126.                         FreeArgs(ArgsPtr);
  127.                     }
  128.                     else {
  129.                         Fault(IoErr(), NULL, inputBuffer, INPUT_BUFFER_SIZE - 1);
  130.                         ULog(ph, -1, "Error in services file - line %ld: %s", line, inputBuffer);
  131.                         leave = TRUE;
  132.                     }
  133.  
  134.                     FreeDosObject(DOS_RDARGS, MyArgs);
  135.                 }
  136.             }
  137.  
  138.             Close(fh);
  139.         }
  140.         else
  141.             ULog(ph, -1, "Couldn't open services file");
  142.  
  143.         MyFreeVec(inputBuffer);
  144.     }
  145.  
  146.     ReleaseSemaphore(&ph->ph_Sema);
  147.  
  148.     return svc;
  149. }
  150.  
  151. void __saveds __asm FreePagerService(register __a0 PagerService_t * svc)
  152. {
  153.     PrivatePagerService_t *psvc;
  154.  
  155.     if (svc) {
  156.         psvc = (PrivatePagerService_t *) ((size_t) svc - offsetof(PrivatePagerService_t, psvc_Service));
  157.  
  158.         ObtainSemaphore(&psvc->psvc_Handle->ph_Sema);
  159.  
  160.         if (--psvc->psvc_UseCount == 0) {
  161.             Remove((struct Node *)&psvc->psvc_Node);
  162.             MyFreeVec(svc);
  163.         }
  164.  
  165.         ReleaseSemaphore(&psvc->psvc_Handle->ph_Sema);
  166.     }
  167. }
  168.